空间投影 Sample详情
最后更新时间:2020年12月11日
地图投影的基本问题是如何将地球表面(椭球面或圆球面)表示在地图平面上。由于地球椭球面或圆球面是不可展开的曲面,即不可能展开成平面。而地图又必须是一个平面,所以将地球表面展开成地图平面必然产生裂隙或褶皱。在编制地图中,要求(在地图上)得到连续的经纬网格,有裂隙或重叠的经纬网格不符合编图要求。如果采用简单的方法将有裂隙或重叠的经纬网“拉伸”或“压缩”使之连续,也不能符合编制地图的实际需要,因此,编制地图必须采用地图投影的方法,将地球表面的经纬网格用各种方法投影到地图平面上,才能满足多种编图要求的各种连续的经纬网格。
地图投影的实质就是根据源参考系将地球椭球面上的经纬线网按照一定的数学法则转移到目标参考系的平面上。然而在地理信息应用中经常需要同时使用不同空间参考系的数据,所以它们之间的数据转换就显得格外重要,MapGIS Mobile提供空间参考系之间投影转换的方法。
空间投影功能对应API程序包为com.zondy.mapgis.spatial(10.3版本:com.zondy.mapgis.core.spatial),其核心接口为空间投影类SpaProjection,通过其提供的lonLat2Mercator()、mercator2LonLat()、projTrans()等方法实现空间投影功能。
常用固定单点投影
许多地图或者坐标数据采用WGS84经纬度和Web墨卡托投影参考系,例如:Google地图采用Web墨卡托投影,Android原生定位获取坐标采用WGS84经纬度。所以SDK提供这两种空间参考系之间的转换方法。
Dot dot=new Dot(114.30,30.60); SpaProjection.lonLat2Mercator(dot);
Dot dot=new Dot(12723817.80,3580909.76); SpaProjection.mercator2LonLat(dot);
自定义单点投影
在实际应用中,有时候采用的数据并不是WGS84经纬度或者Web墨卡托投影,但是又需要进行空间参考系的转换,此时就需要使用自定义的投影转换功能。MapGIS Mobile提供自定义的单个点投影转换功能。自定义单点投影功能实现的关键步骤如下:
(1)获取源投影数据点;
(2)构造空间投影对象(SpaProjection);
(3)设置源投影参数:通过空间投影对象的setSourcePara方法;
(4)设置目标投影参数:通过空间投影对象的setDestinationPara方法;
(5)设置椭球坐标系变换参数:当投影前后椭球体不一样时,必须设置椭球坐标系变换参数。获取椭球参数有两种方式:一种是传递三参数、七参数构造椭球参数;另一种是通过控制点获取椭球参数。
(6)自定义单点投影。
本示例以WGS-84转换为亚尔勃斯等积圆锥投影为例,展示基本实现过程。
1
//获取源投影数据点 Dot dot=new Dot(114.30,30.60);
2
SpaProjection mSpaProjection = new SpaProjection();
3
//通过空间投影对象的setSourcePara方法设置源投影参数 mSpaProjection.setSourcePara(SRefData.getWGS84());
4
//创建空间参照系对象 SRefData sRefData = new SRefData(); sRefData.setSRSID(603); //空间坐标系在地理数据库中的唯一标识 sRefData.setSRSName("Albers Conical Equal Area"); //设置名称 sRefData.setType((short) 3); //空间参照系类型 sRefData.setGCSName("GCS_Krasovsky_1940"); //地理坐标系名称 sRefData.setSpheroid((short) 1); //椭球体索引 sRefData.setA(6378245.0); //地球椭球长轴 sRefData.setB(6356863.018773047); //地球椭球短轴 sRefData.setAf(0.003352329869259137); //地球椭球扁率 sRefData.setPMName("格林威治"); //设置本初子午线名称 sRefData.setPMOffset(0.0); //本初子午线 sRefData.setPCSName("Albers_Conic_Equal_Area"); //设置投影坐标系名称 sRefData.setProjTypeID((short) 2); //投影类型 sRefData.setZone((short) 0); //投影带号 sRefData.setZoneType((short) 0); //投影分带类型 sRefData.setLon(1050000.0); //空间数据中央经线经度 sRefData.setLon1(0.0); //设置空间数据双经线1经度 sRefData.setLon2(0.0); //设置空间数据双经线2经度 sRefData.setLat(0.0); //空间数据投影原点纬度 sRefData.setLat1(250000); //设置空间数据双纬线1纬度 sRefData.setLat2(470000); //设置空间数据双纬线2纬度 sRefData.setFalseE(0.0); //设置投影东偏 sRefData.setFalseN(0.0); //设置投影北偏 sRefData.setX(0.0); //设置图纸坐标原点在投影坐标系中的x值 sRefData.setY(0.0); //设置图纸坐标原点在投影坐标系中的y值 sRefData.setDimension((short) 0); //数据维数 sRefData.setAxisUnit0((short) 0); //设置0轴单位 sRefData.setAxisMin0(0.0); //设置0轴最小值 sRefData.setAxisMax0(0.0); //设置0轴最大值 sRefData.setPrecision0(0.0); //设置0轴精度 sRefData.setAxisUnit1((short) 0); //设置1轴单位 sRefData.setAxisMin1(0.0); //设置1轴最小值 sRefData.setAxisMax1(0.0); //设置1轴最大值 sRefData.setPrecision1(0.0); //设置1轴精度 sRefData.setAxisUnit2((short) 0); //设置2轴单位 sRefData.setAxisMin2(0.0); //设置2轴最小值 sRefData.setAxisMax2(0.0); //设置2轴最大值 sRefData.setPrecision2(0.0); //设置2轴精度 sRefData.setAxisUnit3((short) 0); //设置3轴单位 sRefData.setAxisMin3(0.0); //设置3轴最小值 sRefData.setAxisMax3(0.0); //设置3轴最大值 sRefData.setPrecision3(0.0); //设置3轴精度 sRefData.setUnit((short) 2); //空间数据水平坐标单位:长度 sRefData.setUnitFactor(1.0); //获取米/unit sRefData.setAngUnit((short) 4); //空间数据水平坐标单位:角度 sRefData.setAngUnitFactor(0.0174532925199433); //获取弧度/unit sRefData.setRate(1.0); //空间数据水平比例尺倒数 sRefData.setLevelType((short) 0); //设置空间数据大地水准面类型 sRefData.setLevelOffset(0.0); //设置当前高程的偏移量 sRefData.setN(0.0); //设置空间数据大地水准面与参考椭球面之间的高差 sRefData.setH(0.0); //设置空间数据投影平面与大地水准面的高差 sRefData.setVRate(0.0); //设置空间数据垂向比例尺倒数 sRefData.setVUnit((short) 0); //设置空间数据垂向数据单位 sRefData.setVerticalDatumType((short) 0); //空间数据垂向数据单位 //设置目标投影参数 mSpaProjection.setDestinationPara(sRefData);
5
//通过空间投影对象的setEllipTransParam方法设置椭球坐标系变换参数 ElpTransParam param = new ElpTransParam(); //通过控制点获取椭球参数 Pnt3Struct[] pnt3Structs = new Pnt3Struct[3]; pnt3Structs[0] = new Pnt3Struct(2169866.52, 5544110.90, 1, 2169966.52, 5544210.90, 2); pnt3Structs[1] = new Pnt3Struct(1461526.00, 4376660.78, 1, 1461626.00, 4376760.78, 2); pnt3Structs[2] = new Pnt3Struct(1553347.92, 3517469.97, 1, 1553447.92, 3517569.97, 2); param = ElpTransformation.countCoeByPntList(0, pnt3Structs, SRefData.getWGS84().getSpheroid(), SRefData.getWGS84().getAngUnit(), sRefData.getSpheroid(), sRefData.getAngUnit()); mSpaProjection.setEllipTransParam(param); //设置椭球坐标系变换参数
6
//通过调用空间投影参数的方法实现自定义单点投影 mSpaProjection.projTrans(LonlatDot);